package com.jiepu.daily.corejava.advanceed.part2.day0717;

/**
 * @Description:
 * @author: xinjie.txt
 * @date: 2020/7/20  8:31
 */
public class MyCollectionImpl2 implements MyCollection{

	// 链表中只需要保存一个头节点，即可间接访问到整个链式结构中的所有节点
	private Node first;

	// 节点内部类
	public static class Node {
		public Object data; // 节点中保存的数据
		public Node next;    // 下一个节点的引用

		public Node(Object data) {
			this.data = data;
		}
	}

	// 向集合中添加一个元素
	@Override
	public boolean add(Object o) {

		// 无论节点如何插入，新的节点对象一定是要创建的
		Node node = new Node(o);

		if (first == null) {
			// 如果是第一次向链表中插入数据，让它充当头节点
			first = node;
		} else {
			// 如果不是第一次向链表中插入数据，
			// 需要找到当前链表的尾节点，
			// 让尾节点指向新节点，让新节点充当新的尾节点
			Node n = first;
			while (n.next != null)
				n = n.next;

			// 当while循环结束之后，n就是尾节点了
			n.next = node;
		}
		return true;
	}

	@Override
	public void clear() {
		// 遍历链表，释放每两个节点之间的关联关系
		Node n = first;
		while (n != null) {
			// 如果在这里直接把n.next设为空，就无法继续遍历接下来的节点
			// 所以必须临时存储一下n的下一个节点引用
			// 把n的下一个节点设为空之后，再把刚才保存的引用赋值给n
			Node next = n.next;

			n.next = null;
			n.data = null;

			n = next;
		}

		// 重置头节点
		first = null;
	}

	@Override
	public boolean contains(Object o) {
		Node n = first;
		if (o == null) {
			while (n != null) {
				if (n.data == null)
					return true;
				n = n.next;
			}
		} else {
			while (n != null) {
				if (o.equals(n.data))
					return true;
				n = n.next;
			}
		}
		return false;
	}

	@Override
	public boolean isEmpty() {
		return first == null;
	}

	@Override
	public boolean remove(Object o) {
		// 思路：
		// 先要通过遍历找到要删除的元素存在哪个节点中
		// 让这个节点的上一个节点指向它的下一个节点

		// 问题：找到这个节点之后，它的上一个节点如何取？
		return false;
	}

	@Override
	public int size() {
		return 0;
	}

	@Override
	public Object[] toArray() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Looper looper() {
		// TODO Auto-generated method stub
		return null;
	}


	// 临时定义一个方法，用于打印链表中的所有元素
	// 用于开发过程中的测试
	public void print() {
		Node n = first;

		while (n != null) {
			System.out.println(n.data);
			n = n.next;
		}
	}

}
